/*-------------------------------------------------------------------------
 *
 * explicit_bzero.c
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/port/explicit_bzero.c
 *
 *-------------------------------------------------------------------------
 */

#include "c.h"

#if defined(HAVE_MEMSET_S)

void explicit_bzero(void *buf, size_t len)
{
	(void) memset_s(buf, len, 0, len);
}

#elif defined(WIN32)

void explicit_bzero(void *buf, size_t len)
{
	(void) SecureZeroMemory(buf, len);
}

#else

/*
 * 通过一个volatile指针间接调用，希望避免死存储优化消除该调用。 （这个想法来自OpenSSH。）我们也不能假设bzero()存在，因此为了简化起见，我们自己定义一个。
 */

static void fc_bzero2(void *fc_buf, size_t fc_len)
{
	memset(fc_buf, 0, fc_len);
}

static void (*volatile bzero_p) (void *, size_t) = fc_bzero2;

void explicit_bzero(void *fc_buf, size_t fc_len)
{
	bzero_p(fc_buf, fc_len);
}

#endif
